using System;
using System.Collections.Generic;
using ns26;
using ns27;
using Triton.Game.Mono;

namespace Triton.Game.Mapping
{
	[Attribute38("BouncingBlade")]
	public class BouncingBlade : SuperSpell
	{
		public enum HIT_DIRECTIONS
		{
			NW,
			NE,
			E,
			SW,
			SE,
			N_OFFSCREEN,
			E_OFFSCREEN,
			W_OFFSCREEN,
			S_OFFSCREEN
		}

		[Attribute38("BouncingBlade.HitBonesType")]
		public class HitBonesType : MonoClass
		{
			public HIT_DIRECTIONS Direction => method_2<HIT_DIRECTIONS>("Direction");

			public GameObject Bone => method_3<GameObject>("Bone");

			public Vector3 m_Position => method_2<Vector3>("m_Position");

			public HitBonesType(IntPtr address, string className)
				: base(address, className)
			{
			}

			public HitBonesType(IntPtr address)
				: this(address, "HitBonesType")
			{
			}

			public void SetPosition(Vector3 pos)
			{
				method_8("SetPosition", pos);
			}

			public Vector3 GetPosition()
			{
				return method_11<Vector3>("GetPosition", Array.Empty<object>());
			}
		}

		[Attribute38("BouncingBlade.Target")]
		public class Target : MonoClass
		{
			public GameObject VisualTarget => method_3<GameObject>("VisualTarget");

			public Vector3 TargetPosition => method_2<Vector3>("TargetPosition");

			public bool isMinion => method_2<bool>("isMinion");

			public int MetaDataIdx => method_2<int>("MetaDataIdx");

			public bool LastTarget => method_2<bool>("LastTarget");

			public bool LastBlock => method_2<bool>("LastBlock");

			public bool Offscreen => method_2<bool>("Offscreen");

			public Target(IntPtr address, string className)
				: base(address, className)
			{
			}

			public Target(IntPtr address)
				: this(address, "Target")
			{
			}
		}

		public static float DAMAGE_SPLAT_DELAY => MonoClass.smethod_6<float>(TritonHs.MainAssemblyPath, "", "BouncingBlade", "DAMAGE_SPLAT_DELAY");

		public static float BLADE_ANIMATION_SPEED => MonoClass.smethod_6<float>(TritonHs.MainAssemblyPath, "", "BouncingBlade", "BLADE_ANIMATION_SPEED");

		public static float BLADE_BIRTH_TIME => MonoClass.smethod_6<float>(TritonHs.MainAssemblyPath, "", "BouncingBlade", "BLADE_BIRTH_TIME");

		public static int OFFSCREEN_HIT_PERCENT => MonoClass.smethod_6<int>(TritonHs.MainAssemblyPath, "", "BouncingBlade", "OFFSCREEN_HIT_PERCENT");

		public GameObject m_BladeRoot => method_3<GameObject>("m_BladeRoot");

		public GameObject m_Blade => method_3<GameObject>("m_Blade");

		public GameObject m_Trail => method_3<GameObject>("m_Trail");

		public GameObject m_HitBonesRoot => method_3<GameObject>("m_HitBonesRoot");

		public List<HitBonesType> m_HitBones => method_3<Class271<HitBonesType>>("m_HitBones")?.method_25();

		public float m_BladeSpinningMinVol => method_2<float>("m_BladeSpinningMinVol");

		public float m_BladeSpinningMaxVol => method_2<float>("m_BladeSpinningMaxVol");

		public float m_BladeSpinningRampTime => method_2<float>("m_BladeSpinningRampTime");

		public bool m_Running => method_2<bool>("m_Running");

		public List<Target> m_TargetQueue => method_3<Class271<Target>>("m_TargetQueue")?.method_25();

		public bool m_Animating => method_2<bool>("m_Animating");

		public bool m_isDone => method_2<bool>("m_isDone");

		public HitBonesType m_PreviousHitBone => method_3<HitBonesType>("m_PreviousHitBone");

		public Vector3 m_OrgBladeScale => method_2<Vector3>("m_OrgBladeScale");

		public BouncingBlade(IntPtr address, string className)
			: base(address, className)
		{
		}

		public BouncingBlade(IntPtr address)
			: this(address, "BouncingBlade")
		{
		}

		public new void Awake()
		{
			method_8("Awake");
		}

		public new void Start()
		{
			method_8("Start");
		}

		public new void OnAction(SpellStateType prevStateType)
		{
			method_8("OnAction", prevStateType);
		}

		public void SetupBounceLocations()
		{
			method_8("SetupBounceLocations");
		}

		public void AnimateToNextTarget(Target target)
		{
			method_8("AnimateToNextTarget", target);
		}

		public void RampBladeVolume()
		{
			method_8("RampBladeVolume");
		}

		public void AnimationComplete(Target target)
		{
			method_8("AnimationComplete", target);
		}

		public void AnimateSparks()
		{
			method_8("AnimateSparks");
		}
	}
}
